<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>CruiseControl.NET : Building Packages</title>
	    <link rel="stylesheet" href="styles/site.css" type="text/css" />
        <META http-equiv="Content-Type" content="text/html; charset=UTF-8">	    
    </head>

    <body>
	    <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
		    <tr>
			    <td valign="top" class="pagebody">
				    <div class="pageheader">
					    <span class="pagetitle">
                            CruiseControl.NET : Building Packages
                                                    </span>
				    </div>
				    <div class="pagesubheading">
					    This page last changed on Apr 22, 2009 by <font color="#0050B2">csut017</font>.
				    </div>

				    <h1><a name="BuildingPackages-BuildingPackages"></a>Building Packages</h1>

<h2><a name="BuildingPackages-Introduction"></a>Introduction</h2>

<p>As part of the 1.4.4 release the concept of packages was introduced to the web dashboard. A package is a ZIP file that contains all the necessary files for a plug-in, plus instructions on installing the files.</p>

<p>Examples of files that can be in a package are:</p>
<ul>
	<li>NVelocity templates</li>
	<li>XSL-T definitions</li>
	<li>Images</li>
	<li>Javascript</li>
	<li>Binaries</li>
</ul>


<p>As well as the content files, every package must contain a manifest file. This file contains the instructions for how to install the package. Generally a manifest will contain two sections: where to copy the files and the configuration changes to make.</p>

<h2><a name="BuildingPackages-WritingaManifest"></a>Writing a Manifest</h2>

<p>A manifest consists of three parts:</p>
<ol>
	<li>Information about the package</li>
	<li>Included files and their destination</li>
	<li>Configuration changes</li>
</ol>


<h3><a name="BuildingPackages-PackageInformation"></a>Package Information</h3>

<p>The package information consists of a name, description and type. These are displayed in the admin plug-in to provide additional details on package. </p>

<h4><a name="BuildingPackages-Example%3A"></a>Example:</h4>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
   <span class="code-tag">&lt;name&gt;</span>Package name<span class="code-tag">&lt;/name&gt;</span>
   <span class="code-tag">&lt;description&gt;</span>Package description<span class="code-tag">&lt;/description&gt;</span>
   <span class="code-tag">&lt;type&gt;</span>Plugin<span class="code-tag">&lt;/type&gt;</span>
   <span class="code-tag"><span class="code-comment">&lt;!-- Other elements omitted --&gt;</span></span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

<h4><a name="BuildingPackages-Elements"></a>Elements</h4>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Element </th>
<th class='confluenceTh'> Description </th>
<th class='confluenceTh'> Type </th>
<th class='confluenceTh'> Required </th>
</tr>
<tr>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'> The name of the package. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> Yes </td>
</tr>
<tr>
<td class='confluenceTd'> description </td>
<td class='confluenceTd'> A description of the package and what it contains. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> type </td>
<td class='confluenceTd'> The type of contents of the package. Currently this is only for informational purposes. </td>
<td class='confluenceTd'> enum
<ul>
	<li>Plugin</li>
	<li>Theme</li>
</ul>
</td>
<td class='confluenceTd'> Yes </td>
</tr>
</tbody></table>

<h3><a name="BuildingPackages-IncludedFiles"></a>Included Files</h3>

<p>The ZIP file can contain one or more files that need to be copied to the dashboard. This section in the manifest provides the instructions to where to copy the folders.</p>

<p><em><b>Note:</b> The ZIP file can contain files that are not referenced by the manifest. If there are non-referenced files, they will be ignored (i.e. not installed).</em></p>

<h4><a name="BuildingPackages-Example"></a>Example</h4>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
   <span class="code-tag">&lt;folders&gt;</span>
      <span class="code-tag">&lt;folder&gt;</span>
         <span class="code-tag">&lt;location&gt;</span>relativePath<span class="code-tag">&lt;/location&gt;</span>
         <span class="code-tag">&lt;files&gt;</span>
            <span class="code-tag">&lt;file&gt;</span>nameInPackage<span class="code-tag">&lt;/file&gt;</span>
         <span class="code-tag">&lt;/files&gt;</span>
      <span class="code-tag">&lt;/folder&gt;</span>
   <span class="code-tag">&lt;/folders&gt;</span>
   <span class="code-tag"><span class="code-comment">&lt;!-- Other elements omitted --&gt;</span></span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

<h4><a name="BuildingPackages-Elements"></a>Elements</h4>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Element </th>
<th class='confluenceTh'> Description </th>
<th class='confluenceTh'> Type </th>
<th class='confluenceTh'> Required </th>
</tr>
<tr>
<td class='confluenceTd'> folders </td>
<td class='confluenceTd'> Root element for the file references. </td>
<td class='confluenceTd'> container </td>
<td class='confluenceTd'> Yes </td>
</tr>
<tr>
<td class='confluenceTd'> folder </td>
<td class='confluenceTd'> Defines a folder. Each file to be copied must be copied to a folder (files can be copied to multiple folders). This element defines the target folder for one or more files. <br clear="all" /> There can be multiple folder elements under a folders element. <br clear="all" /> <em><b>Note:</b> Unlike a file system, this element cannot contain sub-folders. If sub-folders are required, they must have their own folder element.</em> </td>
<td class='confluenceTd'> container </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> location </td>
<td class='confluenceTd'> The location of the folder. <br clear="all" /> Each folder must be a relative path. If the folder does not exist, then it will be created automatically by the installation process. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> Yes </td>
</tr>
<tr>
<td class='confluenceTd'> files </td>
<td class='confluenceTd'> The files to be copied into the folder. </td>
<td class='confluenceTd'> container </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> file </td>
<td class='confluenceTd'> The name of the file to be copied. This must be the name of the file within the package, the target file will have the same file name. <br clear="all" /> There can be multiple file elements under a files element. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> No </td>
</tr>
</tbody></table>

<h3><a name="BuildingPackages-Configuration"></a>Configuration</h3>

<p>The final section of the manifest contains the configuration elements to add.</p>

<h4><a name="BuildingPackages-Example"></a>Example</h4>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
   <span class="code-tag">&lt;configuration&gt;</span>
      <span class="code-tag">&lt;setting&gt;</span>
         <span class="code-tag">&lt;path&gt;</span>xPath<span class="code-tag">&lt;/path&gt;</span>
         <span class="code-tag">&lt;name&gt;</span>settingName<span class="code-tag">&lt;/name&gt;</span>
         <span class="code-tag">&lt;filter&gt;</span>xPathFilter<span class="code-tag">&lt;/filter&gt;</span>
         <span class="code-tag">&lt;value&gt;</span>configValue<span class="code-tag">&lt;/value&gt;</span>
         <span class="code-tag">&lt;attributes&gt;</span>
            <span class="code-tag">&lt;attribute name=<span class="code-quote">"attribName"</span> value=<span class="code-quote">"attribValue"</span> /&gt;</span>
         <span class="code-tag">&lt;/attributes&gt;</span>
      <span class="code-tag">&lt;/setting&gt;</span>
   <span class="code-tag">&lt;/configuration&gt;</span>
   <span class="code-tag"><span class="code-comment">&lt;!-- Other elements omitted --&gt;</span></span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

<h4><a name="BuildingPackages-Elements"></a>Elements</h4>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Element </th>
<th class='confluenceTh'> Description </th>
<th class='confluenceTh'> Type </th>
<th class='confluenceTh'> Required </th>
</tr>
<tr>
<td class='confluenceTd'> configuration </td>
<td class='confluenceTd'> The root element for the configuration. </td>
<td class='confluenceTd'> container </td>
<td class='confluenceTd'> Yes </td>
</tr>
<tr>
<td class='confluenceTd'> setting </td>
<td class='confluenceTd'> A configuration setting. This will map to a single configuration element in dashboard.config. <br clear="all" /> There can be multiple setting elements under a configuration element. </td>
<td class='confluenceTd'> container </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> path </td>
<td class='confluenceTd'> An XPath statement to locate the configuration setting. This will be used to find the parent of the setting. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> Yes </td>
</tr>
<tr>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'> The name of the configuration element. This is the name of the element that will be added to dashboard.config. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> Yes </td>
</tr>
<tr>
<td class='confluenceTd'> filter </td>
<td class='confluenceTd'> An optional filter to find an existing occurrence of the element. This is needed for elements that can have the same name (e.g. xslReportBuildPlugin, xslFile, etc.) Otherwise it is assumed that there will only be one element with the name in the parent.<br clear="all" />If used, this is a standard XPath where statement (i.e. the value between [ and ]). </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> value </td>
<td class='confluenceTd'> The value to set. </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> attributes </td>
<td class='confluenceTd'> The root element for the attribute definitions. </td>
<td class='confluenceTd'> container </td>
<td class='confluenceTd'> No </td>
</tr>
<tr>
<td class='confluenceTd'> attribute </td>
<td class='confluenceTd'> An attribute to add to the element. <br clear="all" />There can be multiple attribute elements under the attributes element.  <br clear="all" /> This element has two required attributes:
<ul>
	<li>name: the name of the attribute</li>
	<li>value: the value to set for the attribute</li>
</ul>
</td>
<td class='confluenceTd'> element </td>
<td class='confluenceTd'> No </td>
</tr>
</tbody></table>

<h2><a name="BuildingPackages-TestingaPackage"></a>Testing a Package</h2>

<p>Currently the only way to test a package and ensure that it works is to install it.</p>

<p><em><b>Note:</b> Before installing, make sure you back up dashboard.config and any other important files. Alternately use a fresh install of the web dashboard.</em></p>

<p>Once the package has been built (including the manifest), go to the administrative plug-in and attempt to load and install the plug-in. If the plug-in installs without any problem, check the log to ensure everything occurred as planned. Then check to make sure the packaged contents are working as expected.</p>

<p>Finally, try to uninstall the package. In theory a package should cleanly uninstall, reverting the dashboard back to its previous state. However, in reality all an uninstall does is remove the new entries (either files or configuration settings or both.)</p>

<h2><a name="BuildingPackages-IncludingaPackageintheBuild"></a>Including a Package in the Build</h2>

<p>This section covers the process to add a new package to the CruiseControl.NET distribution. If the package will be distributed by an alternate route, then this section is not relevant.</p>

<p>Since the package will contain files that are normally included in the dashboard, there is no point in building the packages independently. Instead the best approach is to modify the build script to also generate the package.</p>

<p>To modify the script for a new package, use the following steps:</p>

<ol>
	<li>Under the packages folder in the dashboard project add a folder for the new package</li>
	<li>Add an XML called Manifest.xml to this folder</li>
	<li>Add the configuration details (as above) to this file and save it</li>
	<li>Open ccnet.build and add a target for the new package</li>
	<li>In this target, use the &lt;zip&gt; command to compress all the required files (including the manifest)</li>
	<li>The &lt;zip&gt; command should output the file to ${build.dir}\WebDashboard\Packages folder</li>
	<li>Include the new target name in the depends attribute of the "build.packages" target</li>
	<li>Save the file and test the build</li>
</ol>


<p>To modify an existing package just apply the relevant steps from the above process.</p>

<p>The following is an example of a target for generating a package:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;target name=<span class="code-quote">"build.serverLog.package"</span> description=<span class="code-quote">"Generates the server log package"</span>&gt;</span>
  <span class="code-tag">&lt;mkdir dir=<span class="code-quote">"${build.dir}\WebDashboard\Packages\"</span> verbose=<span class="code-quote">"${verbosity}"</span>/&gt;</span>
  <span class="code-tag">&lt;zip zipfile=<span class="code-quote">"${build.dir}\WebDashboard\Packages\ServerLog.zip"</span>&gt;</span>
    <span class="code-tag">&lt;fileset basedir=<span class="code-quote">"${src.dir}\WebDashboard\Packages\ServerLog"</span>&gt;</span>
      <span class="code-tag">&lt;include name=<span class="code-quote">"*.*"</span>/&gt;</span>
    <span class="code-tag">&lt;/fileset&gt;</span>
    <span class="code-tag">&lt;fileset basedir=<span class="code-quote">"${src.dir}\WebDashboard\Templates"</span>&gt;</span>
      <span class="code-tag">&lt;include name=<span class="code-quote">"ServerLog.vm"</span>/&gt;</span>
    <span class="code-tag">&lt;/fileset&gt;</span>
  <span class="code-tag">&lt;/zip&gt;</span>
<span class="code-tag">&lt;/target&gt;</span></pre>
</div></div>

<p>Make sure the relevant files are checked into source control, otherwise the package will build incorrectly.</p>

<h2><a name="BuildingPackages-Examples"></a>Examples</h2>

<p>The following are examples of manifest that have already been written:</p>

<h3><a name="BuildingPackages-QueueStatusDisplay"></a>Queue Status Display</h3>

<p>This is a very simple package. It contains a single template (ServerQueueStatus.vm) and a single configuration change (adds the plug-in to the server plug-in list).</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
  <span class="code-tag">&lt;name&gt;</span>Queue Status Display<span class="code-tag">&lt;/name&gt;</span>
  <span class="code-tag">&lt;description&gt;</span>Display the status of the queues.<span class="code-tag">&lt;/description&gt;</span>
  <span class="code-tag">&lt;type&gt;</span>Plugin<span class="code-tag">&lt;/type&gt;</span>
  <span class="code-tag">&lt;folders&gt;</span>
    <span class="code-tag">&lt;folder&gt;</span>
      <span class="code-tag">&lt;location&gt;</span>Templates<span class="code-tag">&lt;/location&gt;</span>
      <span class="code-tag">&lt;files&gt;</span>
        <span class="code-tag">&lt;file&gt;</span>ServerQueueStatus.vm<span class="code-tag">&lt;/file&gt;</span>
      <span class="code-tag">&lt;/files&gt;</span>
    <span class="code-tag">&lt;/folder&gt;</span>
  <span class="code-tag">&lt;/folders&gt;</span>
  <span class="code-tag">&lt;configuration&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/serverPlugins<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>queueStatusServerPlugin<span class="code-tag">&lt;/name&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
  <span class="code-tag">&lt;/configuration&gt;</span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

<h3><a name="BuildingPackages-ModificationHistory"></a>Modification History</h3>

<p>This example shows that a package does not always need to include files. Instead the package can just define configuration changes. In this example the manifest defines a single new plug-in.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
  <span class="code-tag">&lt;name&gt;</span>Modification History<span class="code-tag">&lt;/name&gt;</span>
  <span class="code-tag">&lt;description&gt;</span>Modification history for a project.<span class="code-tag">&lt;/description&gt;</span>
  <span class="code-tag">&lt;type&gt;</span>Plugin<span class="code-tag">&lt;/type&gt;</span>
  <span class="code-tag">&lt;folders /&gt;</span>
  <span class="code-tag">&lt;configuration&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/projectPlugins<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>modificationHistoryProjectPlugin<span class="code-tag">&lt;/name&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
  <span class="code-tag">&lt;/configuration&gt;</span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

<h3><a name="BuildingPackages-NDependResults"></a>NDepend Results</h3>

<p>In this example, the package contains a single file that is used in multiple places. Additionally, the configuration changes involve both a filter and multiple attributes. The filter condition on each setting allows the installer to identify which element to modify out of several possibilities.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
  <span class="code-tag">&lt;name&gt;</span>NDepend Results<span class="code-tag">&lt;/name&gt;</span>
  <span class="code-tag">&lt;description&gt;</span>Display the results of a NDepend run.<span class="code-tag">&lt;/description&gt;</span>
  <span class="code-tag">&lt;type&gt;</span>Plugin<span class="code-tag">&lt;/type&gt;</span>
  <span class="code-tag">&lt;folders&gt;</span>
    <span class="code-tag">&lt;folder&gt;</span>
      <span class="code-tag">&lt;location&gt;</span>Xsl<span class="code-tag">&lt;/location&gt;</span>
      <span class="code-tag">&lt;files&gt;</span>
        <span class="code-tag">&lt;file&gt;</span>ndependreport-ccnet.v2.xsl<span class="code-tag">&lt;/file&gt;</span>
      <span class="code-tag">&lt;/files&gt;</span>
    <span class="code-tag">&lt;/folder&gt;</span>
  <span class="code-tag">&lt;/folders&gt;</span>
  <span class="code-tag">&lt;configuration&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/buildPlugins/buildReportBuildPlugin/xslFileNames<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;filter&gt;</span>.='xsl\ndependreport-ccnet.v2.xsl'<span class="code-tag">&lt;/filter&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>xslFile<span class="code-tag">&lt;/name&gt;</span>
      <span class="code-tag">&lt;value&gt;</span>xsl\ndependreport-ccnet.v2.xsl<span class="code-tag">&lt;/value&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/buildPlugins<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;filter&gt;</span>@xslFileName='xsl\ndependreport-ccnet.v2.xsl'<span class="code-tag">&lt;/filter&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>xslReportBuildPlugin<span class="code-tag">&lt;/name&gt;</span>
      <span class="code-tag">&lt;attributes&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"description"</span> value=<span class="code-quote">"NDepend Details"</span>/&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"actionName"</span> value=<span class="code-quote">"NDependDetailsBuildReport"</span>/&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"xslFileName"</span> value=<span class="code-quote">"xsl\ndependreport-ccnet.v2.xsl"</span>/&gt;</span>
      <span class="code-tag">&lt;/attributes&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
  <span class="code-tag">&lt;/configuration&gt;</span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

<h3><a name="BuildingPackages-NUnitResults"></a>NUnit Results</h3>

<p>This is a fairly complex example. Not only does it make multiple configuration changes, it also installs multiple files (although all to the same place). Again, the settings use filters to correctly identify the right element to modify and some of the settings have multiple attributes.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;package&gt;</span>
  <span class="code-tag">&lt;name&gt;</span>NUnit Results<span class="code-tag">&lt;/name&gt;</span>
  <span class="code-tag">&lt;description&gt;</span>Display the results of a NUnit run.<span class="code-tag">&lt;/description&gt;</span>
  <span class="code-tag">&lt;type&gt;</span>Plugin<span class="code-tag">&lt;/type&gt;</span>
  <span class="code-tag">&lt;folders&gt;</span>
    <span class="code-tag">&lt;folder&gt;</span>
      <span class="code-tag">&lt;location&gt;</span>Xsl<span class="code-tag">&lt;/location&gt;</span>
      <span class="code-tag">&lt;files&gt;</span>
        <span class="code-tag">&lt;file&gt;</span>unittests.xsl<span class="code-tag">&lt;/file&gt;</span>
        <span class="code-tag">&lt;file&gt;</span>tests.xsl<span class="code-tag">&lt;/file&gt;</span>
        <span class="code-tag">&lt;file&gt;</span>timing.xsl<span class="code-tag">&lt;/file&gt;</span>
      <span class="code-tag">&lt;/files&gt;</span>
    <span class="code-tag">&lt;/folder&gt;</span>
  <span class="code-tag">&lt;/folders&gt;</span>
  <span class="code-tag">&lt;configuration&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/buildPlugins/buildReportBuildPlugin/xslFileNames<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;filter&gt;</span>.='xsl\unittests.xsl'<span class="code-tag">&lt;/filter&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>xslFile<span class="code-tag">&lt;/name&gt;</span>
      <span class="code-tag">&lt;value&gt;</span>xsl\unittests.xsl<span class="code-tag">&lt;/value&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/buildPlugins<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;filter&gt;</span>@xslFileName='xsl\tests.xsl'<span class="code-tag">&lt;/filter&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>xslReportBuildPlugin<span class="code-tag">&lt;/name&gt;</span>
      <span class="code-tag">&lt;attributes&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"description"</span> value=<span class="code-quote">"NUnit Details"</span>/&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"actionName"</span> value=<span class="code-quote">"NUnitDetailsBuildReport"</span>/&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"xslFileName"</span> value=<span class="code-quote">"xsl\tests.xsl"</span>/&gt;</span>
      <span class="code-tag">&lt;/attributes&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
    <span class="code-tag">&lt;setting&gt;</span>
      <span class="code-tag">&lt;path&gt;</span>/dashboard/plugins/buildPlugins<span class="code-tag">&lt;/path&gt;</span>
      <span class="code-tag">&lt;filter&gt;</span>@xslFileName='xsl\timing.xsl'<span class="code-tag">&lt;/filter&gt;</span>
      <span class="code-tag">&lt;name&gt;</span>xslReportBuildPlugin<span class="code-tag">&lt;/name&gt;</span>
      <span class="code-tag">&lt;attributes&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"description"</span> value=<span class="code-quote">"NUnit Timings"</span>/&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"actionName"</span> value=<span class="code-quote">"NUnitTimingsBuildReport"</span>/&gt;</span>
        <span class="code-tag">&lt;attribute name=<span class="code-quote">"xslFileName"</span> value=<span class="code-quote">"xsl\timing.xsl"</span>/&gt;</span>
      <span class="code-tag">&lt;/attributes&gt;</span>
    <span class="code-tag">&lt;/setting&gt;</span>
  <span class="code-tag">&lt;/configuration&gt;</span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div></div>

				    
                    			    </td>
		    </tr>
	    </table>
	    <table border="0" cellpadding="0" cellspacing="0" width="100%">
			<tr>
				<td height="12" background="http://confluence.public.thoughtworks.org//images/border/border_bottom.gif"><img src="images/border/spacer.gif" width="1" height="1" border="0"/></td>
			</tr>
		    <tr>
			    <td align="center"><font color="grey">Document generated by Confluence on Sep 29, 2009 20:59</font></td>
		    </tr>
	    </table>
    </body>
</html>